//package design.templateMethod.helingang.imlClass;
//import design.templateMethod.helingang.CheckUtil.CheckComplete;
//import design.templateMethod.helingang.MaintenanceHandler;
//import design.templateMethod.helingang.abClass.Maintenance;
//import design.templateMethod.helingang.car.Car;
//import design.templateMethod.helingang.car.CarState;
//
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.locks.Lock;
//
///**
// * @program: LearningDemo
// * @description: 新型的保养方式
// * @author: Lenny
// * @create: 2019-08-19 22:04
// **/
//public class NewMaintenance extends Maintenance {
//    public NewMaintenance(Lock lock) {
//        this.lock = lock;
//    }
//
//    public NewMaintenance(Car car, Lock lock) {
//        this.car = car;
//        this.lock = lock;
//    }
//    public void setThread(Thread thread) {
//        this.thread = thread;
//    }
//
//    private Car car;
//    private Lock lock;
//    private Thread thread;
//    private MaintenanceHandler handler;
//    public static boolean STEP_1=false;
//    public static boolean STEP_2=false;
//    public static boolean All_STEP=false;
//    private  static int TRY_TIMES=0;
//    public  static final int TRY_LIMIT_TIME=3;
//    public   static boolean TIME_OUT_FLAG=false;
//    @Override
//    public void check() {
//        /*  单独每个方法
//        *    System.out.println("new 检查");
//             STEP_1=true;
//        * */
//
//        //把两个方法捆绑在一起，必须要传handler
//        if (car.getCarState().getStateCode().equals(CarState.RESERVATION.getStateCode())){
//            System.out.println(thread.getName()+","+car.toString()+"预定成功");
//            car.setCarState(CarState.CHACKE);
//        }
//
//        long startTime = System.currentTimeMillis();
//        lock.lock();
//        try {
//
//            System.out.println(thread.getName()+","+car.toString()+"正在检查");
//            if (handler != null){
//                handler.fixed();
//            }
//            TimeUnit.SECONDS.sleep(3);
//            STEP_1=true;
//            //todo 第一阶段完成数据持久化一次
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        } finally {
//            lock.unlock();
//        }
//        long endTime = System.currentTimeMillis();
//        boolean isOver = CheckComplete.getCheckComplete().IsOverTime(startTime, endTime, 2);
//            while (isOver){
//                if (TRY_TIMES>=TRY_LIMIT_TIME){
//                    TIME_OUT_FLAG=true;
//                    return;
//                }
//                TRY_TIMES++;
//                System.out.println(thread.getName()+","+"check方法执行时间超预期时间,重试第"+TRY_TIMES+"次");
//                check();
//            }
//        CheckComplete.getCheckComplete().checkStep1(this);
//    }
//    @Override
//    public  void fixed(){
//        car.setCarState(CarState.FIXED);
//        System.out.println(thread.getName()+","+car.toString()+"正在维修");
//    }
//
//    @Override
//    public  void wash() {
//        car.setCarState(CarState.WASH);
//        lock.lock();
//        try {
//            System.out.println(thread.getName()+","+car.toString()+"正在洗车");
//            STEP_2=true;
//            //todo 第二阶段完成数据持久化一次
//        }finally {
//           lock.unlock();
//        }
//        CheckComplete.getCheckComplete().checkStep2(this);
//    }
//
//    @Override
//    public void setNextHandler(MaintenanceHandler handler) {
//        this.handler=handler;
//    }
//    public void checkAll(){
//           if (STEP_2&&STEP_2){
//               All_STEP=true;
//               //todo 所有阶段完成数据持久化一次
//           }
//        CheckComplete.getCheckComplete().checkAllStep(this);
//    }
//}
